#ifndef STRINGHANDLER_H
#define STRINGHANDLER_H

#include "systemCallHandler.h"
#include <QRegularExpression>
#include <QStringList>
#include <QTextCodec>
#include <QCryptographicHash>

/**
 * @brief 字符串转换类型枚举
 */
enum class StringConversion {
    ToUpperCase = 1,    // 转换为大写
    ToLowerCase = 2,    // 转换为小写
    ToTitleCase = 3,    // 转换为标题格式
    Reverse = 4,        // 反转字符串
    Trim = 5,           // 去除前后空白
    TrimLeft = 6,       // 去除左侧空白
    TrimRight = 7       // 去除右侧空白
};

/**
 * @brief 字符串编码类型枚举
 */
enum class StringEncoding {
    Utf8 = 1,       // UTF-8编码
    Ascii = 2,      // ASCII编码
    Latin1 = 3,     // Latin-1编码
    Utf16 = 4       // UTF-16编码
};

/**
 * @brief 字符串处理器类
 * 
 * 处理所有字符串相关的系统调用，包括字符串的基本操作、格式化、
 * 查找替换、编码转换等功能。
 * 支持的中断号范围：0x30-0x3F
 */
class StringHandler : public SystemCallHandler
{
    Q_OBJECT

public:
    explicit StringHandler(QObject *parent = nullptr);
    ~StringHandler() override;

    // 重写基类虚函数
    SystemCallResult handleInterrupt(int interruptNumber, CpuSimulator* cpu) override;
    QPair<int, int> getSupportedInterruptRange() const override;
    QString getDescription() const override;
    void reset() override;

private:
    /**
     * @brief INT 0x30 - 计算字符串长度
     * 参数：AX=字符串地址
     * 返回：BX=字符串长度
     */
    SystemCallResult handleStringLength(CpuSimulator* cpu);

    /**
     * @brief INT 0x31 - 字符串复制
     * 参数：AX=源字符串地址, BX=目标地址
     * 返回：CX=复制的字节数
     */
    SystemCallResult handleStringCopy(CpuSimulator* cpu);

    /**
     * @brief INT 0x32 - 字符串比较
     * 参数：AX=字符串1地址, BX=字符串2地址
     * 返回：CX=比较结果（-1:小于, 0:等于, 1:大于）
     */
    SystemCallResult handleStringCompare(CpuSimulator* cpu);

    /**
     * @brief INT 0x33 - 字符串连接
     * 参数：AX=字符串1地址, BX=字符串2地址, CX=结果地址
     * 返回：DX=连接后的字符串长度
     */
    SystemCallResult handleStringConcatenate(CpuSimulator* cpu);

    /**
     * @brief INT 0x34 - 字符串查找
     * 参数：AX=源字符串地址, BX=查找子串地址
     * 返回：CX=找到的位置（-1表示未找到）
     */
    SystemCallResult handleStringFind(CpuSimulator* cpu);

    /**
     * @brief INT 0x35 - 字符串替换
     * 参数：AX=源字符串地址, BX=查找子串地址, CX=替换子串地址, DX=结果地址
     * 返回：EX=替换次数
     */
    SystemCallResult handleStringReplace(CpuSimulator* cpu);

    /**
     * @brief INT 0x36 - 字符串格式转换
     * 参数：AX=字符串地址, BX=转换类型
     * 返回：CX=转换状态（0=成功）
     */
    SystemCallResult handleStringConversion(CpuSimulator* cpu);

    /**
     * @brief INT 0x37 - 字符串分割
     * 参数：AX=源字符串地址, BX=分隔符地址, CX=结果数组地址
     * 返回：DX=分割后的字符串数量
     */
    SystemCallResult handleStringSplit(CpuSimulator* cpu);

    /**
     * @brief INT 0x38 - 子字符串提取
     * 参数：AX=源字符串地址, BX=起始位置, CX=长度, DX=结果地址
     * 返回：EX=提取的字符数
     */
    SystemCallResult handleSubstring(CpuSimulator* cpu);

    /**
     * @brief INT 0x39 - 字符串插入
     * 参数：AX=目标字符串地址, BX=插入位置, CX=插入字符串地址
     * 返回：DX=插入后的字符串长度
     */
    SystemCallResult handleStringInsert(CpuSimulator* cpu);

    /**
     * @brief INT 0x3A - 字符串删除
     * 参数：AX=字符串地址, BX=起始位置, CX=删除长度
     * 返回：DX=删除后的字符串长度
     */
    SystemCallResult handleStringDelete(CpuSimulator* cpu);

    /**
     * @brief INT 0x3B - 字符统计
     * 参数：AX=字符串地址, BX=字符ASCII码
     * 返回：CX=字符出现次数
     */
    SystemCallResult handleCharacterCount(CpuSimulator* cpu);

    /**
     * @brief INT 0x3C - 字符串编码转换
     * 参数：AX=源字符串地址, BX=源编码, CX=目标编码, DX=结果地址
     * 返回：EX=转换状态（0=成功）
     */
    SystemCallResult handleStringEncoding(CpuSimulator* cpu);

    /**
     * @brief INT 0x3D - 正则表达式匹配
     * 参数：AX=字符串地址, BX=正则表达式地址
     * 返回：CX=匹配结果（1=匹配, 0=不匹配）, DX=匹配位置
     */
    SystemCallResult handleRegexMatch(CpuSimulator* cpu);

    /**
     * @brief INT 0x3E - 字符串哈希值计算
     * 参数：AX=字符串地址, BX=哈希算法类型
     * 返回：CX=哈希值（低位）, DX=哈希值（高位）
     */
    SystemCallResult handleStringHash(CpuSimulator* cpu);

    /**
     * @brief INT 0x3F - 字符串格式化
     * 参数：AX=格式字符串地址, BX=参数数组地址, CX=结果地址
     * 返回：DX=格式化后的字符串长度
     */
    SystemCallResult handleStringFormat(CpuSimulator* cpu);

    // 辅助方法

    /**
     * @brief 从内存中读取以空字符结尾的字符串
     * @param cpu CPU模拟器指针
     * @param address 字符串在内存中的起始地址
     * @return QString 读取的字符串
     */
    QString readStringFromMemory(CpuSimulator* cpu, int address);

    /**
     * @brief 向内存中写入字符串
     * @param cpu CPU模拟器指针
     * @param address 目标内存地址
     * @param str 要写入的字符串
     * @param maxLength 最大长度限制
     * @return int 实际写入的字节数
     */
    int writeStringToMemory(CpuSimulator* cpu, int address, const QString& str, int maxLength = -1);

    /**
     * @brief 从内存中读取字符串数组
     * @param cpu CPU模拟器指针
     * @param address 数组起始地址
     * @param count 字符串数量
     * @return QStringList 字符串列表
     */
    QStringList readStringArrayFromMemory(CpuSimulator* cpu, int address, int count);

    /**
     * @brief 向内存中写入字符串数组
     * @param cpu CPU模拟器指针
     * @param address 目标地址
     * @param strings 字符串列表
     * @return int 写入的字符串数量
     */
    int writeStringArrayToMemory(CpuSimulator* cpu, int address, const QStringList& strings);

    /**
     * @brief 执行字符串转换操作
     * @param str 源字符串
     * @param conversionType 转换类型
     * @return QString 转换后的字符串
     */
    QString performStringConversion(const QString& str, StringConversion conversionType);

    /**
     * @brief 执行字符串编码转换
     * @param str 源字符串
     * @param fromEncoding 源编码
     * @param toEncoding 目标编码
     * @return QByteArray 转换后的字节数组
     */
    QByteArray performEncodingConversion(const QString& str, StringEncoding fromEncoding, StringEncoding toEncoding);

    /**
     * @brief 计算字符串哈希值
     * @param str 输入字符串
     * @param algorithm 哈希算法类型
     * @return QByteArray 哈希值
     */
    QByteArray calculateStringHash(const QString& str, QCryptographicHash::Algorithm algorithm);

    /**
     * @brief 执行正则表达式匹配
     * @param text 文本字符串
     * @param pattern 正则表达式模式
     * @param matchPosition 匹配位置输出
     * @return bool 是否匹配成功
     */
    bool performRegexMatch(const QString& text, const QString& pattern, int& matchPosition);

    /**
     * @brief 验证字符串处理参数
     * @param operation 操作类型
     * @param address 地址参数
     * @param length 长度参数
     * @return bool 参数是否有效
     */
    bool validateStringParameters(const QString& operation, int address, int length = -1);

    /**
     * @brief 获取字符串编码类型对应的QTextCodec
     * @param encoding 编码类型
     * @return QTextCodec* 编码器指针
     */
    QTextCodec* getTextCodec(StringEncoding encoding);

    /**
     * @brief 处理字符串格式化
     * @param format 格式字符串
     * @param args 参数列表
     * @return QString 格式化结果
     */
    QString formatString(const QString& format, const QList<QVariant>& args);

private:
    QMap<StringEncoding, QTextCodec*> codecMap;     // 编码器映射表
    QRegularExpression::PatternOptions regexOptions; // 正则表达式选项
    
    // 常量定义
    static const int MAX_STRING_LENGTH = 8192;      // 最大字符串长度
    static const int MAX_ARRAY_SIZE = 256;          // 最大字符串数组大小
    static const int MAX_REPLACEMENT_COUNT = 1000;  // 最大替换次数
    
    // 哈希算法映射
    static const QMap<int, QCryptographicHash::Algorithm> hashAlgorithmMap;
};

#endif // STRINGHANDLER_H 